#pragma once

#include "exports.h"
#include <windows.h>
#include <gl\gl.h>
#include <gl\glu.h>
#include <string>
#include <Utilities\Vector.h>

enum RadiosityAlgorithm
{
	ProgressiveRefinement, 
	ImportanceDriven, 
	FovDriven
};

class RADIOSITY_API Parameters
{
public:
	Parameters(void);

	const int GetWindowWidth(void) const;				
	const int GetWindowHeight(void) const;				
	const int GetRadiosityAlgorithm(void) const;		
	const std::string GetMeshFilename(void) const;	
	const int GetSubdivisionLevel(void) const;		
	const int GetItemBufferResolution(void) const;	
	const int GetTexturesPerFace(void) const;	
	const int GetRadiosityDrawBuffersPerFace(void) const;
	const int GetImportanceDrawBuffersPerFace(void) const;
	const bool GetDisplayAmbient(void) const;				
	const bool GetDisplayFullscreen(void) const;				
	const bool GetDisplayVisualization(void) const;
	const int GetRequestedFPS(void) const;
	const int GetShootLevel(void) const;
	const int GetFovAngle(void) const;
	const int GetFovDecayInterval(void) const;
	const int GetUnshotMipmapShootLevel(void) const;
	const Vector3d GetCameraPosition(const int camera) const;
	const Vector3d GetCameraAim(const int camera) const;
	const Vector3d GetCameraUp(const int camera) const;
	const bool GetDualView(void) const;

	void SetWindowWidth(const int width);										
	void SetWindowHeight(const int height);									
	void SetRadiosityAlgorithm(const RadiosityAlgorithm algorithm);
	void SetMeshFilename(const std::string filename);						
	void SetSubdivisionLevel(const int level);								
	void SetItemBufferResolution(const int resolution);						
	void SetDisplayAmbient(const bool ambient);									
	void SetDisplayFullscreen(const bool fullscreen);								
	void SetDisplayVisualization(const bool visualization);
	void SetRequestedFPS(const int fps);
	void SetShootLevel(const int shootLevel);
	void SetFovAngle(const int fovAngle);
	void SetFovDecayInterval(const int fovInterval);
	void SetUnshotMipmapShootLevel(const int level);
	void SetCameraPosition(const int camera, const Vector3d position);
	void SetCameraAim(const int camera, const Vector3d aim);
	void SetCameraUp(const int camera, const Vector3d up);
	void SetDualView(const bool dualview);

private:
	int _windowWidth;
	int _windowHeight;
	RadiosityAlgorithm _algorithm;
	std::string _meshFilename;
	int _subdivisionLevel;
	int _itemBufferResolution;
	bool _useAmbient;
	bool _displayFullscreen;
	bool _displayVisualization;
	int _requestedFPS;
	int _shootLevel;
	int _fovAngle;
	int _fovDecayInterval;
	int _unshotMipmapShootLevel;
	Vector3d _cameraPosition[2];
	Vector3d _cameraAim[2];
	Vector3d _cameraUp[2];
	bool _dualView;
};
